package roaring

import (
	
)

type arrayContainer struct {
	content []uint16
}

func ( *arrayContainer) () string {
	 := "{"
	for  := .getShortIterator(); .hasNext(); {
		 += fmt.Sprintf("%v, ", .next())
	}
	return  + "}"
}

func ( *arrayContainer) ( []uint32,  int,  uint32) int {
	if  < 0 {
		panic("negative index")
	}
	if len(.content) == 0 {
		return 
	}
	_ = [len(.content)-1+]
	_ = .content[len(.content)-1]
	for  := 0;  < len(.content); ++ {
		[+] =
			uint32(.content[]) | 
	}
	return  + len(.content)
}

func ( *arrayContainer) ( func( uint16) bool) bool {
	 := shortIterator{.content, 0}

	for .hasNext() {
		if !(.next()) {
			return false
		}
	}

	return true
}

func ( *arrayContainer) () shortPeekable {
	return &shortIterator{.content, 0}
}

func ( *arrayContainer) () shortIterable {
	return &reverseIterator{.content, len(.content) - 1}
}

func ( *arrayContainer) () manyIterable {
	return &shortIterator{.content, 0}
}

func ( *arrayContainer) () uint16 {
	return .content[0] // assume not empty
}

func ( *arrayContainer) () uint16 {
	return .content[len(.content)-1] // assume not empty
}

func ( *arrayContainer) () int {
	return .getCardinality() * 2
}

func ( *arrayContainer) () int {
	return .getCardinality() * 2
}

func arrayContainerSizeInBytes( int) int {
	return  * 2
}

// add the values in the range [firstOfRange,endx)
func ( *arrayContainer) (,  int) container {
	if  >=  {
		return 
	}
	 := binarySearch(.content, uint16())
	if  < 0 {
		 = - - 1
	}
	 := binarySearch(.content, uint16(-1))
	if  < 0 {
		 = - - 1
	} else {
		++
	}
	 :=  - 
	 :=  + (.getCardinality() - ) + 
	if  > arrayDefaultMaxSize {
		 := .toBitmapContainer()
		return .iaddRange(, )
	}
	if cap(.content) <  {
		 := make([]uint16, , )
		copy([:], .content[:])
		copy([+:], .content[:])

		.content = 
	} else {
		.content = .content[:]
		copy(.content[+:], .content[:])

	}
	for  := 0;  < ; ++ {
		.content[+] = uint16( + )
	}
	return 
}

// remove the values in the range [firstOfRange,endx)
func ( *arrayContainer) (,  int) container {
	if  >=  {
		return 
	}
	 := binarySearch(.content, uint16())
	if  < 0 {
		 = - - 1
	}
	 := binarySearch(.content, uint16(-1))
	if  < 0 {
		 = - - 1
	} else {
		++
	}
	 :=  - 
	 := 
	copy(.content[:], .content[+:])
	.content = .content[:.getCardinality()-]
	return 
}

// flip the values in the range [firstOfRange,endx)
func ( *arrayContainer) (,  int) container {
	if  >=  {
		return .clone()
	}
	return .notClose(, -1) // remove everything in [firstOfRange,endx-1]
}

// flip the values in the range [firstOfRange,lastOfRange]
func ( *arrayContainer) (,  int) container {
	if  >  { // unlike add and remove, not uses an inclusive range [firstOfRange,lastOfRange]
		return .clone()
	}

	// determine the span of array indices to be affected^M
	 := binarySearch(.content, uint16())
	if  < 0 {
		 = - - 1
	}
	 := binarySearch(.content, uint16())
	if  < 0 {
		 = - - 2
	}
	 :=  -  + 1
	 :=  -  + 1
	 :=  - 
	 :=  - 
	 := len(.content) + 
	if  > arrayDefaultMaxSize {
		return .toBitmapContainer().not(, +1)
	}
	 := newArrayContainer()
	.content = make([]uint16, , ) //a hack for sure

	copy(.content, .content[:])
	 := 
	 := 
	 := 
	for ;  <=  &&  <= ; ++ {
		if uint16() != .content[] {
			.content[] = uint16()
			++
		} else {
			++
		}
	}

	for ;  <= ; ++ {
		.content[] = uint16()
		++
	}

	for  :=  + 1;  < len(.content); ++ {
		.content[] = .content[]
		++
	}
	.content = .content[:]
	return 

}

func ( *arrayContainer) ( container) bool {

	,  := .(*arrayContainer)
	if  {
		// Check if the containers are the same object.
		if  ==  {
			return true
		}

		if len(.content) != len(.content) {
			return false
		}

		for ,  := range .content {
			if  != .content[] {
				return false
			}
		}
		return true
	}

	// use generic comparison
	 := .getCardinality()
	 := .getCardinality()
	if  !=  {
		return false
	}

	 := .getShortIterator()
	 := .getShortIterator()
	for .hasNext() {
		if .next() != .next() {
			return false
		}
	}
	return true
}

func ( *arrayContainer) () *bitmapContainer {
	 := newBitmapContainer()
	.loadData()
	return 

}
func ( *arrayContainer) ( uint16) ( bool) {
	// Special case adding to the end of the container.
	 := len(.content)
	if  > 0 &&  < arrayDefaultMaxSize && .content[-1] <  {
		.content = append(.content, )
		return true
	}

	 := binarySearch(.content, )

	if  < 0 {
		 := .content
		 := - - 1
		 = append(, 0)
		copy([+1:], [:])
		[] = 
		.content = 
		return true
	}
	return false
}

func ( *arrayContainer) ( uint16) container {
	// Special case adding to the end of the container.
	 := len(.content)
	if  > 0 &&  < arrayDefaultMaxSize && .content[-1] <  {
		.content = append(.content, )
		return 
	}

	 := binarySearch(.content, )

	if  < 0 {
		if len(.content) >= arrayDefaultMaxSize {
			 := .toBitmapContainer()
			.iadd()
			return 
		}
		 := .content
		 := - - 1
		 = append(, 0)
		copy([+1:], [:])
		[] = 
		.content = 
	}
	return 
}

// iremoveReturnMinimized is allowed to change the return type to minimize storage.
func ( *arrayContainer) ( uint16) container {
	.iremove()
	return 
}

func ( *arrayContainer) ( uint16) bool {
	 := binarySearch(.content, )
	if  >= 0 {
		 := .content
		 = append([:], [+1:]...)
		.content = 
		return true
	}
	return false
}

func ( *arrayContainer) ( uint16) container {
	 := &arrayContainer{make([]uint16, len(.content))}
	copy(.content, .content[:])

	 := binarySearch(.content, )
	if  >= 0 {
		 := .content
		 = append([:], [+1:]...)
		.content = 
	}
	return 
}

func ( *arrayContainer) ( container) container {
	switch x := .(type) {
	case *arrayContainer:
		return .orArray()
	case *bitmapContainer:
		return .orArray()
	case *runContainer16:
		if .isFull() {
			return .clone()
		}
		return .orArray()
	}
	panic("unsupported container type")
}

func ( *arrayContainer) ( container) int {
	switch x := .(type) {
	case *arrayContainer:
		return .orArrayCardinality()
	case *bitmapContainer:
		return .orArrayCardinality()
	case *runContainer16:
		return .orArrayCardinality()
	}
	panic("unsupported container type")
}

func ( *arrayContainer) ( container) container {
	switch x := .(type) {
	case *arrayContainer:
		return .iorArray()
	case *bitmapContainer:
		return .(*bitmapContainer).orArray()
		//return ac.iorBitmap(x) // note: this does not make sense
	case *runContainer16:
		if .isFull() {
			return .clone()
		}
		return .iorRun16()
	}
	panic("unsupported container type")
}

func ( *arrayContainer) ( *arrayContainer) container {
	 := 
	 := .getCardinality()
	 := .getCardinality()
	 :=  + 
	if  > cap(.content) {
		// doubling the capacity reduces new slice allocations in the case of
		// repeated calls to iorArray().
		 := 2 * 
		// the second check is to handle overly large array containers
		// and should not occur in normal usage,
		// as all array containers should be at most arrayDefaultMaxSize
		if  > 2*arrayDefaultMaxSize &&  <= 2*arrayDefaultMaxSize {
			 = 2 * arrayDefaultMaxSize
		}
		 := make([]uint16, 0, )
		copy([:], .content[0:])
		.content = 
	} else {
		copy(.content[:], .content[0:])
	}
	 := union2by2(.content[:], .content, .content)
	.content = .content[:] // reslice to match actual used capacity

	if  > arrayDefaultMaxSize {
		// Only converting to a bitmap when arrayDefaultMaxSize
		// is actually exceeded minimizes conversions in the case of repeated
		// calls to iorArray().
		return .toBitmapContainer()
	}
	return 
}

// Note: such code does not make practical sense, except for lazy evaluations
func ( *arrayContainer) ( *bitmapContainer) container {
	 := .toBitmapContainer()
	.iorBitmap()
	* = *newArrayContainerFromBitmap()
	return 
}

func ( *arrayContainer) ( *runContainer16) container {
	 := .getCardinality()
	// heuristic for if the container should maybe be an
	// array container.
	if  < .getCardinality() &&
		+.getCardinality() < arrayDefaultMaxSize {
		var  container
		 = 
		for ,  := range .iv {
			 = .iaddRange(int(.start), int(.start)+int(.length)+1)
		}
		return 
	}
	return .orArray()
}

func ( *arrayContainer) ( container) container {
	switch x := .(type) {
	case *arrayContainer:
		return .lazyIorArray()
	case *bitmapContainer:
		return .lazyIorBitmap()
	case *runContainer16:
		if .isFull() {
			return .clone()
		}
		return .lazyIorRun16()

	}
	panic("unsupported container type")
}

func ( *arrayContainer) ( *arrayContainer) container {
	// TODO actually make this lazy
	return .iorArray()
}

func ( *arrayContainer) ( *bitmapContainer) container {
	// TODO actually make this lazy
	return .iorBitmap()
}

func ( *arrayContainer) ( *runContainer16) container {
	// TODO actually make this lazy
	return .iorRun16()
}

func ( *arrayContainer) ( container) container {
	switch x := .(type) {
	case *arrayContainer:
		return .lazyorArray()
	case *bitmapContainer:
		return .lazyOR()
	case *runContainer16:
		if .isFull() {
			return .clone()
		}
		return .orArray()
	}
	panic("unsupported container type")
}

func ( *arrayContainer) ( *arrayContainer) container {
	 := 
	 := .getCardinality() + .getCardinality()
	if  > arrayDefaultMaxSize { // it could be a bitmap!
		 := newBitmapContainer()
		for  := 0;  < len(.content); ++ {
			 := .content[]
			 := uint() >> 6
			 := uint64(1) << ( % 64)
			.bitmap[] |= 
		}
		for  := 0;  < len(.content); ++ {
			 := .content[]
			 := uint() >> 6
			 := uint64(1) << ( % 64)
			.bitmap[] |= 
		}
		.cardinality = int(popcntSlice(.bitmap))
		if .cardinality <= arrayDefaultMaxSize {
			return .toArrayContainer()
		}
		return 
	}
	 := newArrayContainerCapacity()
	 := union2by2(.content, .content, .content)
	.content = .content[:] // reslice to match actual used capacity
	return 
}

func ( *arrayContainer) ( *arrayContainer) int {
	return union2by2Cardinality(.content, .content)
}

func ( *arrayContainer) ( *arrayContainer) container {
	 := 
	 := .getCardinality() + .getCardinality()
	if  > arrayLazyLowerBound { // it could be a bitmap!
		 := newBitmapContainer()
		for  := 0;  < len(.content); ++ {
			 := .content[]
			 := uint() >> 6
			 := uint64(1) << ( % 64)
			.bitmap[] |= 
		}
		for  := 0;  < len(.content); ++ {
			 := .content[]
			 := uint() >> 6
			 := uint64(1) << ( % 64)
			.bitmap[] |= 
		}
		.cardinality = invalidCardinality
		return 
	}
	 := newArrayContainerCapacity()
	 := union2by2(.content, .content, .content)
	.content = .content[:] // reslice to match actual used capacity
	return 
}

func ( *arrayContainer) ( container) container {
	switch x := .(type) {
	case *arrayContainer:
		return .andArray()
	case *bitmapContainer:
		return .and()
	case *runContainer16:
		if .isFull() {
			return .clone()
		}
		return .andArray()
	}
	panic("unsupported container type")
}

func ( *arrayContainer) ( container) int {
	switch x := .(type) {
	case *arrayContainer:
		return .andArrayCardinality()
	case *bitmapContainer:
		return .andCardinality()
	case *runContainer16:
		return .andArrayCardinality()
	}
	panic("unsupported container type")
}

func ( *arrayContainer) ( container) bool {
	switch x := .(type) {
	case *arrayContainer:
		return .intersectsArray()
	case *bitmapContainer:
		return .intersects()
	case *runContainer16:
		return .intersects()
	}
	panic("unsupported container type")
}

func ( *arrayContainer) ( container) container {
	switch x := .(type) {
	case *arrayContainer:
		return .iandArray()
	case *bitmapContainer:
		return .iandBitmap()
	case *runContainer16:
		if .isFull() {
			return 
		}
		return .andArray()
	}
	panic("unsupported container type")
}

func ( *arrayContainer) ( *bitmapContainer) container {
	 := 0
	 := .getCardinality()
	for  := 0;  < ; ++ {
		// branchless
		 := .content[]
		.content[] = 
		 += int(.bitValue())
	}
	.content = .content[:]
	return 

}

func ( *arrayContainer) ( container) container {
	switch x := .(type) {
	case *arrayContainer:
		return .xorArray()
	case *bitmapContainer:
		return .xor()
	case *runContainer16:
		return .xorArray()
	}
	panic("unsupported container type")
}

func ( *arrayContainer) ( *arrayContainer) container {
	 := 
	 := .getCardinality() + .getCardinality()
	if  > arrayDefaultMaxSize { // it could be a bitmap!
		 := newBitmapContainer()
		for  := 0;  < len(.content); ++ {
			 := .content[]
			 := uint() >> 6
			.bitmap[] ^= (uint64(1) << ( % 64))
		}
		for  := 0;  < len(.content); ++ {
			 := .content[]
			 := uint() >> 6
			.bitmap[] ^= (uint64(1) << ( % 64))
		}
		.computeCardinality()
		if .cardinality <= arrayDefaultMaxSize {
			return .toArrayContainer()
		}
		return 
	}
	 := 
	 := newArrayContainerCapacity()
	 := exclusiveUnion2by2(.content, .content, .content)
	.content = .content[:]
	return 

}

func ( *arrayContainer) ( container) container {
	switch x := .(type) {
	case *arrayContainer:
		return .andNotArray()
	case *bitmapContainer:
		return .andNotBitmap()
	case *runContainer16:
		return .andNotRun16()
	}
	panic("unsupported container type")
}

func ( *arrayContainer) ( *runContainer16) container {
	 := .toBitmapContainer()
	 := .toBitmapContainer()
	return .andNotBitmap()
}

func ( *arrayContainer) ( container) container {
	switch x := .(type) {
	case *arrayContainer:
		return .iandNotArray()
	case *bitmapContainer:
		return .iandNotBitmap()
	case *runContainer16:
		return .iandNotRun16()
	}
	panic("unsupported container type")
}

func ( *arrayContainer) ( *runContainer16) container {
	// Fast path: if either the array container or the run container is empty, the result is the array.
	if .isEmpty() || .isEmpty() {
		// Empty
		return 
	}
	// Fast path: if the run container is full, the result is empty.
	if .isFull() {
		.content = .content[:0]
		return 
	}
	 := 0
	// All values in [start_run, end_end] are part of the run
	 := .iv[].start
	 :=  + .iv[].length
	// We are going to read values in the array at index i, and we are
	// going to write them at index pos. So we do in-place processing.
	// We always have that pos <= i by construction. So we can either
	// overwrite a value just read, or a value that was previous read.
	 := 0
	 := 0
	for ;  < len(.content); ++ {
		if .content[] <  {
			// the value in the array appears before the run [start_run, end_end]
			.content[] = .content[]
			++
		} else if .content[] <=  {
			// nothing to do, the value is in the array but also in the run.
		} else {
			// We have the value in the array after the run. We cannot tell
			// whether we need to keep it or not. So let us move to another run.
			if +1 < len(.iv) {
				++
				 = .iv[].start
				 =  + .iv[].length
				-- // retry with the same i
			} else {
				// We have exhausted the number of runs. We can keep the rest of the values
				// from i to len(ac.content) - 1 inclusively.
				break // We are done, the rest of the array will be kept
			}
		}
	}
	for ;  < len(.content); ++ {
		.content[] = .content[]
		++
	}
	// We 'shink' the slice.
	.content = .content[:]
	return 
}

func ( *arrayContainer) ( *arrayContainer) container {
	 := 
	 := .getCardinality()
	 := newArrayContainerCapacity()
	 := difference(.content, .content, .content)
	.content = .content[:]
	return 
}

func ( *arrayContainer) ( *arrayContainer) container {
	 := difference(.content, .content, .content)
	.content = .content[:]
	return 
}

func ( *arrayContainer) ( *bitmapContainer) container {
	 := .getCardinality()
	 := newArrayContainerCapacity()
	.content = .content[:]
	 := 0
	for ,  := range .content {
		.content[] = 
		 += 1 - int(.bitValue())
	}
	.content = .content[:]
	return 
}

func ( *arrayContainer) ( *bitmapContainer) container {
	 := .getCardinality()
	 := newArrayContainerCapacity()
	.content = .content[:]
	 := 0
	for ,  := range .content {
		.content[] = 
		 += int(.bitValue())
	}
	.content = .content[:]
	return 
}

func ( *arrayContainer) ( *bitmapContainer) container {
	 := 0
	for ,  := range .content {
		.content[] = 
		 += 1 - int(.bitValue())
	}
	.content = .content[:]
	return 
}

func copyOf( []uint16,  int) []uint16 {
	 := make([]uint16, )
	for ,  := range  {
		if  ==  {
			break
		}
		[] = 
	}
	return 
}

// flip the values in the range [firstOfRange,endx)
func ( *arrayContainer) (,  int) container {
	if  >=  {
		return 
	}
	return .inotClose(, -1) // remove everything in [firstOfRange,endx-1]
}

// flip the values in the range [firstOfRange,lastOfRange]
func ( *arrayContainer) (,  int) container {
	if  >  { // unlike add and remove, not uses an inclusive range [firstOfRange,lastOfRange]
		return 
	}
	// determine the span of array indices to be affected
	 := binarySearch(.content, uint16())
	if  < 0 {
		 = - - 1
	}
	 := binarySearch(.content, uint16())
	if  < 0 {
		 = - - 1 - 1
	}
	 :=  -  + 1
	 :=  -  + 1

	 :=  - 
	 := make([]uint16, )
	 :=  - 
	 := len(.content) + 
	if  > 0 {
		if  > len(.content) {
			if  > arrayDefaultMaxSize {
				 := .toBitmapContainer()
				.inot(, +1)
				* = *.toArrayContainer()
				return 
			}
			.content = copyOf(.content, )
		}
		 :=  + 1
		copy(.content[+1+:], .content[:+len(.content)-1-])
		.negateRange(, , , , +1)
	} else { // no expansion needed
		.negateRange(, , , , +1)
		if  < 0 {

			for  :=  + ;  < ; ++ {
				.content[] = .content[-]
			}
		}
	}
	.content = .content[:]
	return 
}

func ( *arrayContainer) ( []uint16, , , ,  int) {
	// compute the negation into buffer
	 := 0
	 :=  // value here always >= valInRange,
	// until it is exhausted
	// n.b., we can start initially exhausted.

	 := 
	for ;  <  &&  <= ; ++ {
		if uint16() != .content[] {
			[] = uint16()
			++
		} else {
			++
		}
	}

	// if there are extra items (greater than the biggest
	// pre-existing one in range), buffer them
	for ;  < ; ++ {
		[] = uint16()
		++
	}

	if  != len() {
		panic("negateRange: internal bug")
	}

	for ,  := range  {
		.content[+] = 
	}
}

func ( *arrayContainer) () bool {
	return false
}

func ( *arrayContainer) ( *arrayContainer) container {
	 := minOfInt(.getCardinality(), .getCardinality())
	 := newArrayContainerCapacity()
	 := intersection2by2(
		.content,
		.content,
		.content)
	.content = .content[:]
	return 
}

func ( *arrayContainer) ( *arrayContainer) int {
	return intersection2by2Cardinality(
		.content,
		.content)
}

func ( *arrayContainer) ( *arrayContainer) bool {
	return intersects2by2(
		.content,
		.content)
}

func ( *arrayContainer) ( *arrayContainer) container {
	 := intersection2by2(
		.content,
		.content,
		.content)
	.content = .content[:]
	return 
}

func ( *arrayContainer) () int {
	return len(.content)
}

func ( *arrayContainer) () bool {
	return len(.content) == 0
}

func ( *arrayContainer) ( uint16) int {
	 := binarySearch(.content, )
	if  >= 0 {
		return  + 1
	}
	return - - 1

}

func ( *arrayContainer) ( uint16) int {
	return int(.content[])
}

func ( *arrayContainer) () container {
	 := arrayContainer{make([]uint16, len(.content))}
	copy(.content, .content[:])
	return &
}

func ( *arrayContainer) ( uint16) bool {
	return binarySearch(.content, ) >= 0
}

func ( *arrayContainer) ( *bitmapContainer) {
	.content = make([]uint16, .cardinality, .cardinality)
	.fillArray(.content)
}

func ( *arrayContainer) ( container) {
	switch x := .(type) {
	case *arrayContainer:
		.realloc(len(.content))
		copy(.content, .content)

	case *bitmapContainer:
		.realloc(.cardinality)
		.fillArray(.content)

	case *runContainer16:
		 := int(.getCardinality())
		.realloc()
		 := 0
		for ,  := range .iv {
			for  := .start;  <= .last(); ++ {
				.content[] = 
				++
			}
		}

	default:
		panic("unsupported container type")
	}
}

func ( *arrayContainer) ( int) {
	if cap(.content) <  {
		.content = make([]uint16, )
	} else {
		.content = .content[:]
	}
}

func newArrayContainer() *arrayContainer {
	 := new(arrayContainer)
	return 
}

func newArrayContainerFromBitmap( *bitmapContainer) *arrayContainer {
	 := &arrayContainer{}
	.loadData()
	return 
}

func newArrayContainerCapacity( int) *arrayContainer {
	 := new(arrayContainer)
	.content = make([]uint16, 0, )
	return 
}

func newArrayContainerSize( int) *arrayContainer {
	 := new(arrayContainer)
	.content = make([]uint16, , )
	return 
}

func newArrayContainerRange(,  int) *arrayContainer {
	 :=  -  + 1
	 := newArrayContainerCapacity()
	for  := 0;  < ; ++ {
		.content = append(.content, uint16(+))
	}
	return 
}

func ( *arrayContainer) () ( int) {
	 := len(.content)
	var  uint16
	var ,  uint16

	switch  {
	case 0:
		return 0
	case 1:
		return 1
	default:
		for  := 1;  < ; ++ {
			 = .content[-1]
			 = .content[]

			if  == +1 {
				++
			} else {
				if  <  {
					panic("the fundamental arrayContainer assumption of sorted ac.content was broken")
				}
				if  ==  {
					panic("the fundamental arrayContainer assumption of deduplicated content was broken")
				} else {
					++
					 = 0
				}
			}
		}
		++
	}
	return
}

// convert to run or array *if needed*
func ( *arrayContainer) () container {

	 := .numberOfRuns()

	 := runContainer16SerializedSizeInBytes()
	 := bitmapContainerSizeInBytes()
	 := .getCardinality()
	 := arrayContainerSizeInBytes()

	if  <= minOfInt(, ) {
		return newRunContainer16FromArray()
	}
	if  <= arrayDefaultMaxSize {
		return 
	}
	return .toBitmapContainer()
}

func ( *arrayContainer) () contype {
	return arrayContype
}

func ( *arrayContainer) ( uint16) (container, container) {
	var ,  *arrayContainer

	if len(.content) == 0 {
		return nil, nil
	}

	if  := uint32(.content[0]) + uint32(); highbits() == 0 {
		// Some elements will fall into low part, allocate a container.
		// Checking the first one is enough because they are ordered.
		 = &arrayContainer{}
	}
	if  := uint32(.content[len(.content)-1]) + uint32(); highbits() > 0 {
		// Some elements will fall into high part, allocate a container.
		// Checking the last one is enough because they are ordered.
		 = &arrayContainer{}
	}

	for ,  := range .content {
		 := uint32() + uint32()
		if highbits() > 0 {
			// OK, if high == nil then highbits(y) == 0 for all y.
			.content = append(.content, lowbits())
		} else {
			// OK, if low == nil then highbits(y) > 0 for all y.
			.content = append(.content, lowbits())
		}
	}

	// Ensure proper nil interface.
	if  == nil {
		return nil, 
	}
	if  == nil {
		return , nil
	}

	return , 
}